Kim Wustkamp

개요

Apiserver Crash

Configure wrong arguement

kube-apiserver가 동작하지 않는 상황을 만들고 해결해보자.
--this-is-very-wrong 인자를 붙여서 설정해라.
이후 해결하라.

Misconfigure ETCD connection

이번에는 api서버 파일에 etcd 설정을 잘못 넣어보라.
--etcd-servers=this-is-very-wrong 인자를 붙여서 설정해라.
var에 들어가지 말고 로그를 확인하고 원상복구해라.

Invalid Apiserver Manifest YAML

이상한 양식으로 api서버 넣어라.
그 다음 다시 해결해라

결론

컨트롤 플레인에서 에러가 발생한다면 이를 어떻게 대처할 수 있는가?
당연히 로그를 확인하고 대처해야만 한다.
이때 crictl을 통해서 어떤 컨테이너가 문제 있는지 파악하고, 파드#정적 파드를 건드려서 해결을 할 수 있는 경우가 많다.
/var/log/containers에 들어가서 확인해봐도 되고, journalctl을 쓰는 것도 방법이다.

Apiserver Misconfigured

이제부터 실전
3가지 위치에서 api 서버가 문제가 있으니 이를 해결하라.

Kube Controller Manager Misconfigured

kube-controller-manager에 문제가 생겼으니 해결해보라.

Kubelet Misconfigured

node01의 kubelet이 망가진 모양이니 고쳐봐라.

Application Misconfigured 1

application1 네임스페이스에 Deployment가 있다.
다른 거 쓰지 말고 얘만 사용해서 잘 돌아가게 만들어라.

Application Misconfigured 2

다른 클러스터의 양식을 그대로 가져와서 Deployment를 배포해보는데 제대로 동작하지 않는다.
어느 클러스터에서든 동작하도록 만들어보자.

Application Multi Container Issue

Gather logs

management 네임스페이스에 멀티 컨테이너 Deployment이 있다.
해당 디플의 모든 컨테이너의 로그를 /root/logs.log로 모아라.

Fix the Deployment

방금 두 컨테이너가 80 포트를 쓰는 게 문제였으니, 하나는 지워라.

ConfigMap Access in Pods

Create ConfigMaps

두 개의 컨피그맵을 만들어야 한다.
tree=trauerweide이란 내용의 trauerweide라는 ConfigMap을 만들어라.
cm.yaml 파일을 이용해서도 하나 만들어봐라.

Access ConfigMaps in Pod

nginx:alpine 이미지로 pod1을 만들어라.
trauerweide를 환경변수 TREE1란 이름으로 받아라.
birke의 configmap의 키는 전부 /etc/birke/*의 볼륨으로 받아라.

참고

컨피그맵 내용을 잘못 만들어서, 해당 내용을 수정했는데 이게 파드에 바로 반영이 안 됐다.
찾아보니 환경변수로 넣은 경우에는 무조건 파드를 재시작해야 한다고 한다.
볼륨으로 넣은 경우에는 자동으로 추적해주기는 한다는 듯.

Ingress Create

Create Services for existing Deployments

world 네임스페이스 안에 Ingress로 접근돼야 하는 두 Deployment가 있다.
디플과 같은 이름이고 포트가 80번이 열린 ClusterIP Service를 만들어라.

Create Ingress for existing Services

이미 Nginx Ingress Controller는 설치돼있다.
도메인 이름 world.universe.mine이라고 하는 world 인그레스를 만들어보자.
노드에 /etc/hosts에 해당 도메인이 등록되어 있어 정상적으로 이용 가능할 것이다.
30080포트로 europe, asia 각각의 경로 라우팅이 돼야 한다.

NetworkPolicy Namespace Selector

space1, space2 네임스페이스가 있다.
space1의 파드들만 space2로 갈 수 있도록 하는 np란 이름의 NetworkPolicy를 만들고 싶다.
대신 space1은 인커밍은 자유롭고, space2는 아웃고잉이 자유롭다.
그럼에도 53포트로 tcp, udp dns 아웃고잉 트래픽은 자유롭게 처리할 수 있게 하라.

NetworkPolicy Misconfigured

default 네임스페이스에 위치한 level=100x 라벨을 가진 파드들은 같은 라벨을 가진 level-1000,level-1001,level-1002에 있는 파드들과 상호작용할 수 있어야 한다.
np-100x NetworkPolicy를 알맞게 고쳐라.

RBAC ServiceAccount Permissions

ns1, ns2 네임스페이스 있다.
pipeline이라는 ServiceAccount를 양쪽에 만들어라.
이 둘은 클러스터의 모든 것을 볼 수 있어야 한다.
이를 위해 view ClusterRole을 사용하라.
이 둘은 각각 자신의 네임스페이스에 Deployment을 만들고 지울 수 있다.
kubectl auth can-i를 통해 검증하라.

RBAC User Permissions

applications라는 네임스페이스가 있다.
smoke라는 유저는 파드, Deployment, StatefulSet을 만들고 지울 수 있어야 한다.
그리고 kube-system을 제외한 모든 네임스페이스에 view 권한이 있어야 한다.

Scheduling Priority

Find Pod with highest priority

management에 있는 가장 우선순위가 높은 파드를 찾아 지워라.

Create Pod with higher priority

lion 네임스페이스에 메모리 1기비를 요구하는 파드가 있다.
PriorityClass가 지정되어 있다.
nginx:1.21.6-alpine 이미지의 important 파드를 만들어라.
이 녀석도 같은 메모리를 요구해야 한다.
그리고 기존보다 더 높은 우선순위를 부여해라.

Scheduling Pod Affinity

hobby.yaml이라는 양식 파일이 있다.
해당 파드는 level=restricted 라벨이 붙은 파드가 있는 노드에 스케줄되길 선호(prefer)해야 한다.
호스트네임으로 topologyKey를 써야 한다.
테인트, 톨러레이션는 걸려있지 않기에, 테인트, 톨러레이션은 쓰지 않아도 된다.

Scheduling Pod Anti Affinity

파드 양식 파일이 있다.
level=restricted 라벨이 있는 파드가 없는 노드에 스케줄될 것이 요구된다.
topologyKey는 호스트 네임.

DaemonSet HostPath Configurator

DaemonSet은 노드에 어떤 일을 해야 할 때 주로 설정한다.
다음의 조건을 만족하는 데몬셋을 만들어라.

Cluster Setup

Install Controlplane

두 개의 가상머신이 있으니 이걸로 클러스터를 구성하라.
kube 시리즈는 이미 다 깔려 있다.
일단 controle plane부터 시작이다.

Add Worker Node

node-summer를 워커 노드로 넣어보자.

Cluster Upgrade

Upgrade Controlplane

컨트롤플레인, kubectl, kubelet을 업그레이드하자.

Upgrade Worker node

워커 노드도 업그레이드하라.

Cluster Node Join

node01을 조인 시키자.

Cluster Certificate Management

Read out certificate expiration

kube-apiserver의 인증 만기일을 출력하여 apiserver-expiration에 저장하자.

Renew certificates

apiserver, scheduler.conf를 새로 갱신하자.

Static Pod move

Move a static Pod to another Node

resource-reserver-beta를 컨트롤플레인에 옮기고, 이름도 v1으로 바꾸자.